<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    function Star(name, age) {
      this.name = name
      this.age = age
    }
    // 公共方法写在原型上
    Star.prototype.sing = function () {
      console.log('我会唱歌')
    }
    const ldh = new Star('刘德华', 18)
    ldh.sing()

    // 1. 方法属性的查找规则 
    // 首先看ldh这个对象身上是否有sing方法，如果有，就执行对象上的这个方法。
    // 如果没有sing这个方法，就会通过__proto__去实例的原型上查找。

    // 2. __proto__隐式原型
    // 实例通过__proto__ 访问（链接）到了它的原型对象
    // ==>  ldh.__proto__  ===> 访问到了原型
    // ==>  Star.prototype ===> 访问到了原型
    ldh.__proto__ === Star.prototype

    // 3. __proto__ 它就相当于是一个桥梁， 我们创建的实例、对象，可以通过它访问原型。
    //表示 实例也原型(对象)之间的一个关系
    // ldh（实例）   ===>    Star.prototype (原型)
    // ==>  实例对象.__proto__ === 构造函数.prototype
  </script>
</body>

</html>